<?php
/**
 * 应用公共函数文件
 * 
 * @package		comnide
 * @author			B.I.T
 * @copyright		Copyright (c) 2013 - 2015.
 * @license			
 * @link				
 * @since				Version 1.15
 */
// ------------------------------------------------------------------------
// 
/*
* ============================== 截取含有 html标签的字符串 =========================
* @param (string) $str   待截取字符串
* @param (int)  $lenth  截取长度
* @param (string) $repalce 超出的内容用$repalce替换之（该参数可以为带有html标签的字符串）
* @param (string) $anchor 截取锚点，如果截取过程中遇到这个标记锚点就截至该锚点处
* @return (string) $result 返回值
* @demo  $res = cut_html_str($str, 256, '...'); //截取256个长度，其余部分用'...'替换
*/
function cut_html_str($str, $lenth, $replace='...', $anchor='<!-- break -->'){ 
    $_lenth = mb_strlen($str, "utf-8"); // 统计字符串长度（中、英文都算一个字符）
    if($_lenth <= $lenth){
        return $str;    // 传入的字符串长度小于截取长度，原样返回
    }
    $strlen_var = strlen($str);     // 统计字符串长度（UTF8编码下-中文算3个字符，英文算一个字符）
    if(strpos($str, '<') === false){ 
        $re=mb_substr($str, 0, $lenth,"utf-8");  // 不包含 html 标签 ，直接截取
        return $re.$replace;
    } 
    if($e = strpos($str, $anchor)){ 
        return mb_substr($str, 0, $e);  // 包含截断标志，优先
    } 
    $html_tag = 0;  // html 代码标记 
    $result = '';   // 摘要字符串
    $html_array = array('left' => array(), 'right' => array()); //记录截取后字符串内出现的 html 标签，开始=>left,结束=>right
    /*
    * 如字符串为：<h3><p><b>a</b></h3>，假设p未闭合，数组则为：array('left'=>array('h3','p','b'), 'right'=>'b','h3');
    * 仅补全 html 标签，<? <% 等其它语言标记，会产生不可预知结果
    */
    for($i = 0; $i < $strlen_var; ++$i) { 
        if(!$lenth) break;  // 遍历完之后跳出
        $current_var = substr($str, $i, 1); // 当前字符
        if($current_var == '<'){ // html 代码开始 
            $html_tag = 1; 
            $html_array_str = ''; 
        }else if($html_tag == 1){ // 一段 html 代码结束 
            if($current_var == '>'){ 
                $html_array_str = trim($html_array_str); //去除首尾空格，如 <br / > < img src="" / > 等可能出现首尾空格
                if(substr($html_array_str, -1) != '/'){ //判断最后一个字符是否为 /，若是，则标签已闭合，不记录
                    // 判断第一个字符是否 /，若是，则放在 right 单元 
                    $f = substr($html_array_str, 0, 1); 
                    if($f == '/'){ 
                        $html_array['right'][] = str_replace('/', '', $html_array_str); // 去掉 '/' 
                    }else if($f != '?'){ // 若是?，则为 PHP 代码，跳过
                        // 若有半角空格，以空格分割，第一个单元为 html 标签。如：<h2 class="a"> <p class="a"> 
                        if(strpos($html_array_str, ' ') !== false){ 
                        // 分割成2个单元，可能有多个空格，如：<h2 class="" id=""> 
                        $html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2))); 
                        }else{ 
                        //若没有空格，整个字符串为 html 标签，如：<b> <p> 等，统一转换为小写
                        $html_array['left'][] = strtolower($html_array_str); 
                        } 
                    } 
                } 
                $html_array_str = ''; // 字符串重置
                $html_tag = 0; 
            }else{ 
                $html_array_str .= $current_var; //将< >之间的字符组成一个字符串,用于提取 html 标签
            } 
        }else{ 
            --$lenth; // 非 html 代码才记数
        } 
        $ord_var_c = ord($str{$i}); 
        switch (true) { 
            case (($ord_var_c & 0xE0) == 0xC0): // 2 字节 
                $result .= substr($str, $i, 2); 
                $i += 1; break; 
            case (($ord_var_c & 0xF0) == 0xE0): // 3 字节
                $result .= substr($str, $i, 3); 
                $i += 2; break; 
            case (($ord_var_c & 0xF8) == 0xF0): // 4 字节
                $result .= substr($str, $i, 4); 
                $i += 3; break; 
            case (($ord_var_c & 0xFC) == 0xF8): // 5 字节 
                $result .= substr($str, $i, 5); 
                $i += 4; break; 
            case (($ord_var_c & 0xFE) == 0xFC): // 6 字节
                $result .= substr($str, $i, 6); 
                $i += 5; break; 
            default: // 1 字节 
                $result .= $current_var; 
        } 
    } 
    if($html_array['left']){ //比对左右 html 标签，不足则补全
        $html_array['left'] = array_reverse($html_array['left']); //翻转left数组，补充的顺序应与 html 出现的顺序相反
        foreach($html_array['left'] as $index => $tag){ 
            $key = array_search($tag, $html_array['right']); // 判断该标签是否出现在 right 中
            if($key !== false){ // 出现，从 right 中删除该单元
                unset($html_array['right'][$key]); 
            }else{ // 没有出现，需要补全 
                $result .= '</'.$tag.'>'; 
            } 
        } 
    } 
    return $result.$replace; 
}
/**
 * 配合前台jquery datatable组件使用
 * @param	post_info string datatable组件post数据
 */

function getDataTable($post_info=array()){
	//每页显示条目数
	$countPerPage	= $post_info['iDisplayLength'];
	//数据起始条目数
	$startNum = $post_info['iDisplayStart'];
	//当前请求页码。$startNum从0开始，计算时候需要+1
	$startNum=intval($startNum)+1;
	if($startNum <= $countPerPage) $currentpage=1;
	else @$currentpage=($startNum-($startNum % $countPerPage))/$countPerPage+1;
	//列配置个数
	$colLen = $post_info['iColumns'];
	//将列依次放入$columns数组
	$colunms = array();
	for ($i = 0; $i < $colLen; $i++) {
		$colunms[$i]=$post_info['mDataProp_'.$i];
	}
	//去除空元素
	$colunms=array_filter($colunms);
	//搜索内容
	$search = $post_info['sSearch'];
	//-----获取搜索字段-----
	$col_search=array();
	foreach ($colunms as $key=>$val){
		if($post_info['bSearchable_'.$key]=='true'){
			array_push($col_search, $val);
		}
	}
	//排序方式
	$sortType = $post_info['sSortDir_0'];
	//-----获取排序字段-----
	$col_sort=array();
	foreach ($colunms as $key=>$val){
		if($post_info['bSortable_'.$key]=='true'){
			array_push($col_sort, $val);
		}
	}
	if(count($col_sort)>0) $sortField =$colunms[$post_info['iSortCol_0']];
	else $sortField="";
	//排序
	$where_sort="";
	if($sortField!="") $where_sort='`'.$sortField."` ".$sortType." ";
	return array(
			"cpp"=>$countPerPage,
			"start"=>$startNum,
			"current"=>$currentpage,
			"column"=>$colunms,
			"sortfield"=>$sortField,
			"sorttype"=>$sortType,
			"search"=>$search,
			"searchfield"=>$col_search,
			"order"=>$where_sort
	);
}
/**
 * 将包含[]的字符串拆分成数组
 * @param	string string 要拆分的字符串
 * @param	delimiter string 分隔符
 * @return	array 返回数组
 * @example 字符串[a],[b],[c],[d]拆分成数组array(a,b,c,d)
 */
function m_split($string, $delimiter=","){
	$retArray=array();
	if($string=="") return $retArray;
	foreach (explode($delimiter, $string) as $val){
		$val=str_replace('[', '', $val);
		$val=str_replace(']', '', $val);
		array_push($retArray, $val);
	}
	return $retArray;
}

/**
 * 将数组合并成包含[]的字符串
 * @param	array array 要合并的数组
 * @param	glue string 分隔符
 * @return	string 返回字符串
 * @example 数组array(a,b,c,d)合并成字符串[a],[b],[c],[d]
 */
function m_join($array, $glue=","){
	if($array==""|| !is_array($array) || count($array)==0) return "";
	$newArr=array();
	foreach ($array as $val){
		if($val!="") array_push($newArr, '['.$val.']');
	}
	return implode($glue, $newArr);
}

/**
 * upload_img() 图片上传
 * @param string $path 上传路径
 * @param string $file_name 上传图片原始名称
 * @param string $file_size		上传图片大小
 * @param string $file_tmp    上传图片临时路径
 * @param string $post_id     上传图片原所属的ID
 * @param string $post_name 上传图片原所属名称
 * @return string $pics 图片名称 false上传失败
 */
function upload_img($path,$file_name,$file_size,$file_tmp,$post_id="",$post_name="",$max_size=""){
	$img_name='';
	if($max_size==''){
		$max=ini_get("post_max_size")*1024000;
	}else{
		$max=$max_size*1024000;
	}
	
	if($post_id!=''){
		$img_name=$post_name;
	}
	$suffix= strtolower(strstr($file_name, '.'));
	if($suffix!='.gif'&&$suffix!='.jpg'&&$suffix!='.jpeg'&&$suffix!='.png'&&$suffix!='.bmp')
	{
		return false;    //图片格式错误
		exit();
	}
	if($file_size>$max){
		return false;  //图片超过上传最大值
		exit();
	}
	$upload_path=ROOT_PATH.'/'.$path;		//布局图片上传路径
	if(!file_exists($upload_path))
	{
		createDir($upload_path,0755);
	}
	
	$rand = rand(100, 999);	//随机数
	if($img_name!=''){
		$pics = $img_name;
	}else{
		$pics = date("YmdHis") . $rand .$suffix;
	}
	$pic_path=$upload_path.'/'.$pics;
	$upload=move_uploaded_file($file_tmp, $pic_path);
	if($upload){
		return $pics;
	}else{
		return false;  //上传失败
		exit();
	}
}



/**
 * deleteDir()删除非空目录
 * @param  $dirPath string
 * @throws InvalidArgumentException
 */
function deleteDir($dirPath) {
	if (! is_dir($dirPath)) {
		return false;
	}
	if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') {
		$dirPath .= '/';
	}
	$files = glob($dirPath . '*', GLOB_MARK);
	foreach ($files as $file) {
		if (is_dir($file)) {
			deleteDir($file);
		} else {
			unlink($file);
		}
	}
	rmdir($dirPath);
}

/**
 * delDir_cache()情况cache文件夹下的所有文件
 */
function delDir_cache()
{
	$dh=opendir(CACHE_PATH);
	while ($file=readdir($dh)){
		if($file!="." && $file!=".."){
			$fullpath=$dir."/".$file;
			if(!is_dir($fullpath)) {
				unlink($fullpath);
			} else {
				delDir_cache($fullpath);
			}
		}
	}
	closedir($dh);
}
/**
 * delDir()依次删除文件夹下的素有文件
 * @param unknown_type $dir
 */
function delDir($dir){
	//先删除目录下的文件：
	if(!is_dir($dir)){
		return true;exit();
	}
	$dh=opendir($dir);
	while ($file=readdir($dh)) {
		if($file!="." && $file!="..") {
			$fullpath=$dir."/".$file;
			if(!is_dir($fullpath)) {
				unlink($fullpath);
			} else {
				deldir($fullpath);
			}
		}
	}
	closedir($dh);
	//删除当前文件夹：
	if(rmdir($dir)) {
		return true;
	} else {
		return false;
	}
}
/**
 * createDir()依次创建文件夹
 * @param  $dir string
 */
function createDir($dir){
	if(!file_exists($dir)){
		createDir(dirname($dir));
		mkdir($dir,0777);
	}
}

class App_U_Session extends CO_Session{

  function __construct(){
    // $_SESSION['admin']=array();
    $this->_session=&$_SESSION['user'];
    // $this->_session['app_a']=array();
  }

  /**
   * 获取session值
   * @return  mixed 数值
   */
  function get($key){
    return $this->_session['app_u'][$key];
  }

  /**
   * 设置session值
   * @param key string 键s
   * @param val string 值
   * @return  object 当前对象
   */
  function set($key, $val){
    $this->_session['app_u'][$key]=$val;
    return $this;
  }

  function setImg($key,$val){
  	$tmp=$this->_session['app_u'][$key]=array();
  	array_push($tmp, $val);
    return $this;
  }
  // *
  //  * 销毁会话
  //  * @return boolean
   
  function destroy(){
    //return session_destroy();
    unset($this->_session['app_u']);
    session_destroy();
  }

  function is_login(){
    if(!isset($this->_session['app_u']) || count($this->_session)==0) return false;
    return true;
  }
  function login_check($redirect_path){
    if(!$this->is_login()) $this->login_redirect($redirect_path);
  }
  function login_redirect($redirect_path=''){
    if($redirect_path=='') $redirect_path='/login';
    header('location:'.$redirect_path);
    exit;
  }
}
?>
